﻿package yii{

	import flash.data.*;
	import flash.errors.*;
	import flash.filesystem.*;
	import phpas3.*;


	public class PDOStatement{

		private var _nativeStatement:SQLStatement;
		private var _lastResult:SQLResult;
		private var _pointer:uint = 0;

		public function get queryString():String{
			return _nativeStatement.text;
		}



		// コンストラクタ
		public function PDOStatement( conn:SQLConnection, query_str:String ){
			_nativeStatement = new SQLStatement();
			_nativeStatement.sqlConnection = conn;
			_nativeStatement.text = query_str;
		}



		// 結果セットの次行から単一カラムを返します。 行がもうない場合には FALSE を返します。
		public function fetchColumn( $column_number:int=0 ):*{
			//Yii.log( "fetchColumn" );
			if( !_lastResult.data ){
				return false;
			}

			if( _pointer < _lastResult.data.length ){
				var result:* = _lastResult.data[_pointer];
				var i:uint = 0;
				for( var index in result ){
					if( i == $column_number ){
						return result[index];
					}
					i++;
				}
			}
			return false;
		}


		// 全ての結果行を含む配列を返す
		public function fetchAll( fetch_style:int, fetch_argument:*=null, ctor_args:Array=null ):Array{
			return _lastResult.data;
		}


		// 結果セットから次の行を取得する
		// この関数が成功した場合の返り値は、取得形式によって異なります。 失敗した場合は常に FALSE を返します。
		public function fetch( fetch_style:int, cursor_orientation:int=PDO.FETCH_ORI_NEXT, cursor_offset:int=0 ):*{
			//Yii.log( "fetch" );
			if( !_lastResult.data ){
				return false;
			}

			if( _pointer < _lastResult.data.length ){
				var result:* = _lastResult.data[_pointer];
				_pointer++;
				return result;
			} else {
				return false;
			}
		}


		public function execute( input_parameters:Array=null ):Boolean{
			//Yii.log( "execute" );

			// パラメータバインド
			if( input_parameters ){
				for( var index in input_parameters ){
					bindValue( index, input_parameters[index] );
				}
			}
			_nativeStatement.execute();
			_lastResult = _nativeStatement.getResult();
			_pointer = 0;
			return true;
		}



		public function rowCount():int{
			return _lastResult.rowsAffected;
		}

		// カーソルを閉じてステートメントを再実行できるようにする
		public function closeCursor():Boolean{
			_nativeStatement.clearParameters();
			return true;
		}


		public function bindValue( parameter:*, value:*, data_type:int=PDO.PARAM_STR ):Boolean{
			_nativeStatement.parameters[parameter] = value;
			return true;
		}










	}
}